﻿// Tudoku POJ - 2918.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//https://vjudge.csgrandeur.cn/problem/POJ-2918

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;
/*
汤姆是数学理论领域的大师。最近他在我们大学成立了一个研究实验室，并教新手吉姆。在第一堂课上，他向吉姆解释了Tudoku游戏。
Tudoku是Sudoku游戏的一个简单变体，因为它由一个几乎所有数字都已填入的棋盘组成。
当汤姆因懒于填写最后几个直观的格子而停止解决普通的Sudoku时，就会留下这样一个棋盘。
现在，你需要帮助吉姆解决汤姆给他留下的所有Tudoku。

Sudoku是在一个9×9的棋盘上进行的，被分成九个不同的3×3区块。
初始时，只有少数数字已经填入，目标是填充剩余的格子，使得每行、每列和每个3×3区块都包含1到9的每个数字。
这可能相当困难，但请记住，汤姆已经填满了大部分的格子。
可以使用以下规则重复解决Tudoku棋盘：如果某行、某列或某个3×3区块恰好包含八个数字，则填入剩下的一个数字。

在下面的例子中，还缺少三个格子。左上角的格子无法直接确定，因为在它的行、列或区块中都没有出现八个数字。
然而，可以使用上述规则来确定右边的格子的缺失数字，因为它所在的列恰好包含八个数字。
同样地，可以通过检查所在行来确定最底部的自由格子的数字。
最后一个自由格子可以通过观察其所在行、列或区块来填写。

7	5	3	2	8	4	6	9	1
4	8	2	9	1	6	5	3	7
1	9	6	7	5	3	8	4	2
9	3	1		6		4	2	5
2	7	5	4	9	1	3	8	6
6	4	8		3	2	1	7	9
5	6	7	3	4	9	2	1	8
8	2	4	1	7	5	9	6	3
3	1	9	6	2	8	7	5	4


输入：
第一行包含场景的数量。对于每个场景，输入包含九行，每行有九个数字。零表示汤姆没有填写的单元格，需要你填写。每个场景以一个空行结束。

输出：
每个场景的输出以包含“Scenario #i:”的行开始，其中i是从1开始的场景编号。然后，以与输入相同的格式打印解决的Tudoku棋盘，只是将零替换为正确的数字。
用空行终止场景的输出。

示例：
输入：
2
700400805
000010000
080600020
000050040
608070503
040020000
000030040
203009008
506007001

000006810
100905070
000010350
000004020
268000437
030800000
059060000
070302090
081500600

输出：
Scenario #1:
791436825
235819674
486657129
917352486
628174593
543926718
372589461
263791548
159243876

Scenario #2:
294756813
137985472
586214359
715694328
268139437
439827561
659163784
874312596
381549627
*/
/*
const int N = 9;
string Tu[N];
int n;

int CheckCol() {
	int ret = 0;

	for (int y = 0; y < 9; y++) {
		int zeroCnt = 0; int sum = 45;//1+2+3+4=5+6+7+8+9=45
		int zeroX = -1; int zeroY = -1;
		for (int x = 0; x < 9; x++) {
			if (Tu[x][y] == '0') {
				zeroCnt++;
				zeroX = x; zeroY = y;
			}
			else {
				sum -= int(Tu[x][y] - '0');
			}
		}
		if (zeroCnt == 1) {
			Tu[zeroX][zeroY] = char(sum + '0');
			ret = 1;
		}
	}

	return ret;
}

int CheckLine() {
	int ret = 0; 

	for (int i = 0; i < 9; i++) {
		int zeroCnt = 0; int sum = 45;//1+2+3+4=5+6+7+8+9=45
		int zeroX = -1; int zeroY = -1;
		for (int j = 0; j < 9; j++) {
			if (Tu[i][j] == '0') {
				zeroCnt++;
				zeroX = i; zeroY = j;
			}
			else {
				sum -= int(Tu[i][j] - '0');
			}
		}
		if (zeroCnt == 1) {
			Tu[zeroX][zeroY] = char(sum+'0');
			ret = 1;
		}
	}

	return ret;
}

int CheckGrid() {
	int sum[3][3] = { 45,45,45,45,45,45,45,45,45 };
	int zeroCnt[3][3] = { 0,0,0,0,0,0,0,0,0 };
	int ZeroX[3][3] = { -1,-1,-1,-1,-1,-1,-1,-1,-1 };
	int ZeroY[3][3] = { -1,-1,-1,-1,-1,-1,-1,-1,-1 };

	int ret = 0;

	for (int x = 0; x < 9; x++) {
		for (int y = 0; y < 9; y++) {
			int i = x / 3; int j = y / 3;
			if (Tu[x][y] == '0') {
				zeroCnt[i][j]++;
				ZeroX[i][j] = x;
				ZeroY[i][j] = y;
			}
			else {
				sum[i][j] -= int(Tu[x][y] - '0');
			}
		}
	}

	for (int x = 0; x < 3; x++) {
		for (int y = 0; y < 3; y++) {
			if (zeroCnt[x][y] == 1) {
				Tu[ZeroX[x][y]][ZeroY[x][y]] = sum[x][y];
				ret = 1;
			}
		}
	}

	return ret;
}

void solve(int curr) {
	for (int i = 0; i < 9; i++) {
		Tu[i].clear();
		cin >> Tu[i];
	}
	int succ = 1;
	while (succ == 1) {
		succ = 0;
		succ |= CheckLine();
		succ |= CheckCol();
		succ |= CheckGrid();
	}

	cout << "Scenario #" << curr << ":" << endl;
	for (int i = 0; i < 9; i++) {
		cout << Tu[i] << endl;
	}

}

int main()
{
	cin >> n;
	for (int ca = 1; ca <= n; ca++) {
		solve(ca);
	}
	return 0;
}
*/

int main() {

	return 0;
}
 